<?php

namespace CHOMP\SGIBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use CHOMP\SGIBundle\Entity\Incidente;
use CHOMP\SGIBundle\Entity\IncidenteListCriteria;
use CHOMP\SGIBundle\Entity\Comentario;
use CHOMP\SGIBundle\Entity\Estado;
use CHOMP\SGIBundle\Entity\Prioridad;
use CHOMP\SGIBundle\Entity\Empresa;
use CHOMP\SGIBundle\Entity\CuentaAnalitica;
use CHOMP\SGIBundle\Entity\Usuario;
use CHOMP\SGIBundle\Form\Type\IncidenteType;
use CHOMP\SGIBundle\Form\Type\IncidenteNuevoType;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Pagerfanta\Pagerfanta;
use Pagerfanta\Adapter\DoctrineORMAdapter;
use Doctrine\ORM\EntityRepository;
use CHOMP\SGIBundle\Services\SessionManager;
use JMS\DiExtraBundle\Annotation as DI;
use Symfony\Component\HttpFoundation\Session\Session;
use CHOMP\SGIBundle\Entity\Auditoria;

class IncidentesController extends Controller {

	/**
	 * 
	 * @var SessionManager
	 * @DI\Inject("session.manager")
	 */
	public $sessionSvc;
	
	public $us;

    public function listarAction(Request $request, $page) {
		if ($this->sessionSvc->userIsLogged()){
			$this->us = $this->sessionSvc->getCurrentUser();
			if($this->us->getRol()->getNombre()=='Administrador'){
	
				$workflows = $this->getDoctrine()->getRepository('CHOMPSGIBundle:Workflow')->getByEmmpresa($this->sessionSvc->getSession('empresa'));
				$cuentaAnalitica = $this->getDoctrine()->getRepository('CHOMPSGIBundle:CuentaAnalitica')->getByEmmpresa($this->sessionSvc->getSession('empresa'));
				$grupoSoporte = $this->getDoctrine()->getRepository('CHOMPSGIBundle:GrupoSoporte')->getByEmmpresa($this->sessionSvc->getSession('empresa'));
				
				if(count($grupoSoporte)<1){
					$this->sessionSvc->addFlash('msgWarn','Bienvenido! Debe dar de alta al menos un Grupo de Soporte.');				
					return $this->redirect($this->generateUrl('gruposoporte_nuevo'));
				}
				if(count($cuentaAnalitica)<1){
					$this->sessionSvc->addFlash('msgWarn','Bienvenido! Debe dar de alta al menos una Cuenta Analitica.');				
					return $this->redirect($this->generateUrl('cuentaAnalitica_nuevo'));
				}
				if(count($workflows)<1){
					$this->sessionSvc->addFlash('msgWarn','Bienvenido! Debe dar de alta al menos un Workflow.');				
					return $this->redirect($this->generateUrl('workflow_nuevo'));			
				}
			}		
			
			$form = $this->createFormBuilder()
				->add('id', 'number', array('label' => 'Nro. de Incidente', 'required' => false))
				->add('titulo', 'text', array('label' => 'Título', 'required' => false))
	
				->add('empresa', 'entity', array(
					'label' => 'Empresa',
					'class' => 'CHOMP\SGIBundle\Entity\Empresa',
					'required' => false,
					'empty_value' => '== Seleccione Empresa ==',
					'query_builder' => function(EntityRepository $er) {
						return $er->createQueryBuilder('u')
									->where('u.id = '.$this->us->getEmpresa()->getId())
									->orderBy('u.nombre', 'ASC');
					},
				))
	
				->add('creador', 'text', array(
					'label' => 'Creado por',
					'required' => false))
				->add('responsableSoporte', 'text', array(
					'label' => 'Responsable Soporte',
					'required' => false))
	
				->add('estado', 'entity', array(
					'label' => 'Estado',
					'class' => 'CHOMP\SGIBundle\Entity\Estado',
					'required' => false,
					'empty_value' => '== Seleccione Estado ==',
					'query_builder' => function(EntityRepository $er) {
						return $er->createQueryBuilder('u')
							->orderBy('u.nombre', 'ASC');
					},
						))
					
				->add('grupoSoporte', 'entity', array(
					'label' => 'Grupo de Soporte',
					'class' => 'CHOMP\SGIBundle\Entity\GrupoSoporte',
					'required' => false,
					'empty_value' => '== Seleccione Grupo de Soporte ==',
					'query_builder' => function(EntityRepository $er) {
						return $er->createQueryBuilder('u')
							->where('u.empresa = '.$this->us->getEmpresa()->getId())
							->orderBy('u.nombre', 'ASC');
					},
				))
				->add('periodo', 'choice', array(
					'required' => false,
					'empty_value' => '== Seleccione Periodo ==',
					'choices' => array(
						1 => 'Ayer',
						2 => 'Ultimos 7 dias',
						3 => 'Ultimos 30 dias'
					)
				))
				->add('filtrar', 'submit')
				->getForm();
	
			$form->handleRequest($request);
	
			$em = $this->getDoctrine()->getManager();
	
			if ($form->isValid()) {
				$data = $form->getData();
	
				$criteria = new IncidenteListCriteria();
				if ($data["id"] != null)                 { $criteria->setId($data["id"]); }
				if ($data["titulo"] != null)             { $criteria->setTitulo("%" . $data["titulo"] . "%"); }
				if ($data["empresa"] != null)            { 
					$criteria->setEmpresa($data["empresa"]); 
				}else{
					if($this->sessionSvc->getSession('esAdmin') != 'SI'){
						$criteria->setEmpresa($this->us->getEmpresa());
					}
				}				if ($data["creador"] != null)            { $criteria->setCreador("%" . $data["creador"] . "%"); }
				if ($data["responsableSoporte"] != null) { $criteria->setResponsableSoporte("%" . $data["responsableSoporte"] . "%"); }
				if ($data["estado"] != null)             { $criteria->setEstado($data["estado"]); }
				if ($data["grupoSoporte"] != null)       { $criteria->setGrupoSoporte($data["grupoSoporte"]); }
				if ($data["periodo"] != null)       	 { $criteria->setPeriodo($data["periodo"]); }
	
				$query = $em->getRepository('CHOMPSGIBundle:Incidente')->findByCriteria($criteria, $request);
				$this->sessionSvc->setSession('query', $query->getResult());
			}else{
				
				$session = $request->getSession();
				
				if($session->get('esAdmin')=='NO'){
					$idsEmpresas = $this->sessionSvc->getEmpresasFor('VER_INCIDENTE');
					$this->sessionSvc->setSession('empresas', $idsEmpresas);
					if($idsEmpresas=='ALL'){
						$query = $this->getDoctrine()->getRepository('CHOMPSGIBundle:Incidente')->getAllActivas();
						$this->sessionSvc->setSession('query', $query->getResult());		
					}else{
						$usuario = $this->sessionSvc->getCurrentUser();
						$idsEmpresas = $idsEmpresas.''.$usuario->getEmpresa()->getId();
						$query = $this->getDoctrine()->getRepository('CHOMPSGIBundle:Incidente')->getAllActivasPorEmpresa($idsEmpresas);						
						$this->sessionSvc->setSession('query', $query->getResult());
					}
				}else{
					$query = $this->getDoctrine()->getRepository('CHOMPSGIBundle:Incidente')->getAllActivas();		
					$this->sessionSvc->setSession('query', $query->getResult());
				}
			}
	
			$paginador = new Pagerfanta(new DoctrineORMAdapter($query));
			$paginador->setMaxPerPage(10);
			$paginador->setCurrentPage($page);
	
			return $this->render('CHOMPSGIBundle:Incidentes:listar.html.twig', array('incidentes' => $paginador,
						'form' => $form->createView()));
		}else{
			return $this->redirect($this->generateUrl('chompsgi_homepage'));	
		}
    }

    public function listarMioAction(Request $request, $page) {
		if ($this->sessionSvc->userIsLogged()){
			$this->us = $this->sessionSvc->getCurrentUser();
			
			$form = $this->createFormBuilder()
				->add('id', 'number', array('label' => 'Nro. de Incidente', 'required' => false))
				->add('titulo', 'text', array('label' => 'Título', 'required' => false))
	
				->add('empresa', 'entity', array(
					'label' => 'Empresa',
					'class' => 'CHOMP\SGIBundle\Entity\Empresa',
					'required' => false,
					'empty_value' => '== Seleccione Empresa ==',
					'query_builder' => function(EntityRepository $er) {
						return $er->createQueryBuilder('u')
									->where('u.id = '.$this->us->getEmpresa()->getId())
									->orderBy('u.nombre', 'ASC');
					},
				))
	
				->add('creador', 'text', array(
					'label' => 'Creado por',
					'required' => false))
				->add('responsableSoporte', 'text', array(
					'label' => 'Responsable Soporte',
					'required' => false))
	
				->add('estado', 'entity', array(
					'label' => 'Estado',
					'class' => 'CHOMP\SGIBundle\Entity\Estado',
					'required' => false,
					'empty_value' => '== Seleccione Estado ==',
					'query_builder' => function(EntityRepository $er) {
						return $er->createQueryBuilder('u')
							->orderBy('u.nombre', 'ASC');
					},
						))
					
				->add('grupoSoporte', 'entity', array(
					'label' => 'Grupo de Soporte',
					'class' => 'CHOMP\SGIBundle\Entity\GrupoSoporte',
					'required' => false,
					'empty_value' => '== Seleccione Grupo de Soporte ==',
					'query_builder' => function(EntityRepository $er) {
						return $er->createQueryBuilder('u')
							->orderBy('u.nombre', 'ASC');
					},
				))
				->add('periodo', 'choice', array(
					'required' => false,
					'empty_value' => '== Seleccione Periodo ==',
					'choices' => array(
						1 => 'Ayer',
						2 => 'Ultimos 7 dias',
						3 => 'Ultimos 30 dias'
					)
				))
				->add('filtrar', 'submit')
				->getForm();
	
			$form->handleRequest($request);
	
			$em = $this->getDoctrine()->getManager();
	
			if ($form->isValid()) {
				$data = $form->getData();
	
				$criteria = new IncidenteListCriteria();
				if ($data["id"] != null)                 { $criteria->setId($data["id"]); }
				if ($data["titulo"] != null)             { $criteria->setTitulo("%" . $data["titulo"] . "%"); }
				if ($data["empresa"] != null)            { 
					$criteria->setEmpresa($data["empresa"]); 
				}else{
					if($this->sessionSvc->getSession('esAdmin') != 'SI'){
						$criteria->setEmpresa($this->us->getEmpresa());
					}
				}
				if ($data["creador"] != null)            { $criteria->setCreador("%" . $data["creador"] . "%"); }
				if ($data["responsableSoporte"] != null) { $criteria->setResponsableSoporte("%" . $data["responsableSoporte"] . "%"); }
				if ($data["estado"] != null)             { $criteria->setEstado($data["estado"]); }
				if ($data["grupoSoporte"] != null)       { $criteria->setGrupoSoporte($data["grupoSoporte"]); }
				if ($data["periodo"] != null)       	 { $criteria->setPeriodo($data["periodo"]); }
	
				$query = $em->getRepository('CHOMPSGIBundle:Incidente')->findByCriteria($criteria, $request);
				$this->sessionSvc->setSession('query', $query->getResult());
			}else{
				
				$session = $request->getSession();
				
				$usuario = $this->sessionSvc->getCurrentUser();
				$query = $this->getDoctrine()->getRepository('CHOMPSGIBundle:Incidente')->getAllActivasMias($usuario->getId());						
				$this->sessionSvc->setSession('query', $query->getResult());
			}
	
			$paginador = new Pagerfanta(new DoctrineORMAdapter($query));
			$paginador->setMaxPerPage(10);
			$paginador->setCurrentPage($page);
	
			return $this->render('CHOMPSGIBundle:Incidentes:listar.html.twig', array('incidentes' => $paginador,
						'form' => $form->createView()));
		}else{
			return $this->redirect($this->generateUrl('chompsgi_homepage'));	
		}
    }
	
    public function verAction($id) {
		if ($this->sessionSvc->userIsLogged()){
			$incidente = $this->getDoctrine()
					->getRepository('CHOMPSGIBundle:Incidente')
					->find($id);
					
			$path = $incidente->getWebPath();
			
			
			$fechaCierre = $incidente->getFechaCierreAutomatico();
			$fechaCierreDT = new \DateTime($fechaCierre);
			$comentarios = $incidente->getComentarios();

			if($this->sessionSvc->isGranted('VER_INCIDENTE_ALL')){
				$prioridad = 'true';
				$comentario = 'true';		
				$gruposoporte = 'true';		
				$responsablesoporte = 'true';		
				$cuentaanalitica = 'true';		
				$estado = 'true';
				$responsablecliente = 'true';		
			}else{
				$prioridad = $this->sessionSvc->isGranted('VER_INCIDENTE_PRIORIDAD');		
				$comentario = $this->sessionSvc->isGranted('VER_INCIDENTE_COMENTARIO');		
				$gruposoporte = $this->sessionSvc->isGranted('VER_INCIDENTE_GRUPOSOPORTE');		
				$responsablesoporte = $this->sessionSvc->isGranted('VER_INCIDENTE_RESPONSABLESOPORTE');		
				$cuentaanalitica = $this->sessionSvc->isGranted('VER_INCIDENTE_CUENTAANALITICA');		
				$estado = $this->sessionSvc->isGranted('VER_INCIDENTE_ESTADO');		
				$responsablecliente = $this->sessionSvc->isGranted('VER_INCIDENTE_RESPONSABLECLIENTE');		
			}
	
			return $this->render('CHOMPSGIBundle:Incidentes:ver.html.twig', array(  'incidente' => $incidente,
																					'prioridad' => $prioridad,
																					'comentario' => $comentario,		
																					'gruposoporte' => $gruposoporte,		
																					'responsablesoporte' => $responsablesoporte,		
																					'cuentaanalitica' => $cuentaanalitica,		
																					'estado' => $estado,
																					'responsablecliente' => $responsablecliente,
																					'path' => $path,
																					'cantComentarios' => count($comentarios),
																					'comentarios' => $comentarios,
																					'fechaCierreAutomatico' => $fechaCierreDT));
		}else{
			return $this->redirect($this->generateUrl('chompsgi_homepage'));	
		}
    }


    public function verComentariosAction($id) {
		if ($this->sessionSvc->userIsLogged()){
			$incidente = $this->getDoctrine()
					->getRepository('CHOMPSGIBundle:Incidente')
					->find($id);
					
			//$path = $incidente->getWebPath();
			
			
			/*
			$fechaCierre = $incidente->getFechaCierreAutomatico();
			$fechaCierreDT = new \DateTime($fechaCierre);
			*/
			$comentarios = $incidente->getComentarios();

			/*
			if($this->sessionSvc->isGranted('VER_INCIDENTE_ALL')){
				$prioridad = 'true';
				$comentario = 'true';		
				$gruposoporte = 'true';		
				$responsablesoporte = 'true';		
				$cuentaanalitica = 'true';		
				$estado = 'true';
				$responsablecliente = 'true';		
			}else{
				$prioridad = $this->sessionSvc->isGranted('VER_INCIDENTE_PRIORIDAD');		
				$comentario = $this->sessionSvc->isGranted('VER_INCIDENTE_COMENTARIO');		
				$gruposoporte = $this->sessionSvc->isGranted('VER_INCIDENTE_GRUPOSOPORTE');		
				$responsablesoporte = $this->sessionSvc->isGranted('VER_INCIDENTE_RESPONSABLESOPORTE');		
				$cuentaanalitica = $this->sessionSvc->isGranted('VER_INCIDENTE_CUENTAANALITICA');		
				$estado = $this->sessionSvc->isGranted('VER_INCIDENTE_ESTADO');		
				$responsablecliente = $this->sessionSvc->isGranted('VER_INCIDENTE_RESPONSABLECLIENTE');		
			}
			*/
	
			return $this->render('CHOMPSGIBundle:Incidentes:verComentarios.html.twig', array('incidente' => $incidente,
																					'cantComentarios' => count($comentarios),
																					'comentarios' => $comentarios,
																					));
		}else{
			return $this->redirect($this->generateUrl('chompsgi_homepage'));	
		}
    }

    public function altaComentarioAction(Request $request, $idIncidente) {
		if ($this->sessionSvc->userIsLogged()){

			$incidente = $this->getDoctrine()->getRepository('CHOMPSGIBundle:Incidente')->find($idIncidente);
			
			$comentario = new Comentario();
			
			$comentario->setComentario($request->get('comentario'));
			$comentario->setIncidente($incidente);
			$comentario->setUsuario($this->sessionSvc->getCurrentUser());
			$incidente->addComentario($comentario);

			$em = $this->getDoctrine()->getManager();
			$em->persist($incidente);
			$em->flush();

			$incidente = $this->getDoctrine()->getRepository('CHOMPSGIBundle:Incidente')->find($idIncidente);
			$path = $incidente->getWebPath();
			$fechaCierre = $incidente->getFechaCierreAutomatico();
			$fechaCierreDT = new \DateTime($fechaCierre);

			$comentarios = $incidente->getComentarios();

			if($this->sessionSvc->isGranted('VER_INCIDENTE_ALL')){
				$prioridad = 'true';
				$comentario = 'true';		
				$gruposoporte = 'true';		
				$responsablesoporte = 'true';		
				$cuentaanalitica = 'true';		
				$estado = 'true';
				$responsablecliente = 'true';		
			}else{
				$prioridad = $this->sessionSvc->isGranted('VER_INCIDENTE_PRIORIDAD');		
				$comentario = $this->sessionSvc->isGranted('VER_INCIDENTE_COMENTARIO');		
				$gruposoporte = $this->sessionSvc->isGranted('VER_INCIDENTE_GRUPOSOPORTE');		
				$responsablesoporte = $this->sessionSvc->isGranted('VER_INCIDENTE_RESPONSABLESOPORTE');		
				$cuentaanalitica = $this->sessionSvc->isGranted('VER_INCIDENTE_CUENTAANALITICA');		
				$estado = $this->sessionSvc->isGranted('VER_INCIDENTE_ESTADO');		
				$responsablecliente = $this->sessionSvc->isGranted('VER_INCIDENTE_RESPONSABLECLIENTE');		
			}
	
			return $this->render('CHOMPSGIBundle:Incidentes:verComentarios.html.twig', array('incidente' => $incidente,
																					'cantComentarios' => count($comentarios),
																					'comentarios' => $comentarios,
																					));
		}else{
			return $this->redirect($this->generateUrl('chompsgi_homepage'));	
		}
    }

    public function nuevoAction(Request $request) {
		if ($this->sessionSvc->userIsLogged()){
			$session = $request->getSession();
			$workflows = $this->getDoctrine()->getRepository('CHOMPSGIBundle:Workflow')->getByEmmpresa($session->get('empresa'));
			$cuentaAnalitica = $this->getDoctrine()->getRepository('CHOMPSGIBundle:CuentaAnalitica')->getByEmmpresa($session->get('empresa'));
			$grupoSoporte = $this->getDoctrine()->getRepository('CHOMPSGIBundle:GrupoSoporte')->getByEmmpresa($session->get('empresa'));
			
			$usuariosCliente = $this->getDoctrine()->getRepository('CHOMPSGIBundle:Usuario')->usuarioPorRol($session->get('empresa'), 'Cliente Externo');
			$idsRol = '0';
			foreach($usuariosCliente as $usuarioC){
				$idsRol = $idsRol.' ,'.$usuarioC->getRol()->getId();
			}
			$this->sessionSvc->setSession('idsRol', $idsRol);
			
			if(count($workflows)>0 && count($grupoSoporte)>0 && count($cuentaAnalitica)>0){
				$incidente = new Incidente();
				$empresa = $this->getDoctrine()->getRepository('CHOMPSGIBundle:Empresa')->find($session->get('empresa'));
				$userSession = $this->getDoctrine()->getRepository('CHOMPSGIBundle:Usuario')->find($this->sessionSvc->getCurrentUser());
				$incidente->setCreador($userSession);
				$incidente->setEmpresa($empresa); 
				
				$form = $this->createForm(new IncidenteType($session->get('empresa'), $this->sessionSvc, 'CREAR', ''), $incidente)
						->add('file')
						->add('save', 'submit', array ('label' => 'Guardar', 'attr'=> array('class'=>'btn')));
		
				$form->handleRequest($request);
				
				if ($form->get('save')->isClicked()) {
	
					$incidente->setCreador($userSession);
					$incidente->setEmpresa($empresa);
					
					$comentarios = $incidente->getComentarios();
					
					foreach($comentarios as $comentario){
						if(is_null($comentario->getComentario())){
							$incidente->removeComentario($comentario);
						}
					}
					
					$tipo2 = gettype($incidente->getFechaCA());
					
					$hs = $incidente->getPrioridad()->getSLA();
					$b = 8;
					
					if($hs>=8){
						$c=round($hs/$b);
						$fechaLimiteSla = new \DateTime('NOW +'.$c.' day');
					}else{
						$fechaLimiteSla = new \DateTime('NOW +'.$hs.' hour');
					}		
					
					$fechaCierreAutomatico = new \DateTime($incidente->getFechaCA());
					
					if($tipo2!='NULL'){$incidente->setFechaCierreAutomatico($fechaCierreAutomatico);}
					$incidente->setFechaLimiteSLA($fechaLimiteSla);
					
					if ($form->isValid()) {
		
						$em = $this->getDoctrine()->getManager();
						
						$em->persist($incidente);
						$em->flush();
						
						$incidente->upload();
						$em->persist($incidente);
						$em->flush();

						$us = $this->getDoctrine()->getManager();
			
						if(!is_null($incidente->getResponsableSoporte())){
		
							$usuario = $us->getRepository('CHOMPSGIBundle:Usuario')->findOneBy(array('id' => $incidente->getResponsableSoporte()));
							$prioridad = $us->getRepository('CHOMPSGIBundle:Prioridad')->findOneBy(array('id' => $incidente->getPrioridad()));
						
							try{
								$message = \Swift_Message::newInstance()
								->setSubject('Se le ha asignado un incidente.')
								->setFrom('sgicaece@gmail.com')
								->setTo($usuario->getEmail())
								->setBody( 'Se le ha asignado el incidente con ID: '.$incidente->getId().',  con una prioridad: '.$prioridad->getNombre().' (Tiempo máximo de resolución: '.$prioridad->getSLA().'hs) y nombre: '.$incidente->getTitulo().' puede visualizarlo desde la web.');
											
								$this->get('mailer')->send($message);
							}catch(Exception $e){
								return $this->redirect($this->generateUrl('incidentes_listar')); 
							}
						}else{
							$usuarios = $us->getRepository('CHOMPSGIBundle:Usuario')->buscarCoord($incidente->getEmpresa()->getId());
							foreach($usuarios as $usuario){
								try{
									$message = \Swift_Message::newInstance()
									->setSubject('Incidente sin Responsable Soporte.')
									->setFrom('sgicaece@gmail.com')
									->setTo($usuario->getEmail())
									->setBody( 'Se ha creado un incidente sin Responsable soporte, le pedimos asigne uno para poder continuar con el flujo común del proceso de solución del mismo. Este, tiene ID: '.$incidente->getId().', y título: "'.$incidente->getTitulo().'"');	
									$this->get('mailer')->send($message);
								}catch(Exception $e){
									return $this->redirect($this->generateUrl('incidentes_listar')); 
								}
							}							
						}
						return $this->redirect($this->generateUrl('incidentes_listar')); 
					 }
				}
//				var_dump($form->getErrors());
		
				return $this->render('CHOMPSGIBundle:Incidentes:nuevo.html.twig', array(
							'form' => $form->createView(),
							'gruposSopote' => $grupoSoporte,
							'incidente' => $incidente));
			}else{
				$this->sessionSvc->addFlash('msgWarn','Debe definir al menos un Workflow, una Cuenta Analitica y un Grupo Soporte en su Empresa.');
				return $this->redirect($this->generateUrl('incidentes_listar')); 
			}
		}else{
			return $this->redirect($this->generateUrl('chompsgi_homepage'));	
		}
    }

    public function editarAction(Request $request, $id) {
		if ($this->sessionSvc->userIsLogged()){
			$session = $request->getSession();
			$em = $this->getDoctrine()->getManager();
			$incidente = $em->getRepository('CHOMPSGIBundle:Incidente')->find($id);
			$comentarios = $incidente->getComentarios();
			$workflows = $this->getDoctrine()->getRepository('CHOMPSGIBundle:Workflow')->getByEmmpresa($incidente->getEmpresa()->getId());
			$cuentaAnalitica = $this->getDoctrine()->getRepository('CHOMPSGIBundle:CuentaAnalitica')->getByEmmpresa($incidente->getEmpresa()->getId());
			$grupoSoporte = $this->getDoctrine()->getRepository('CHOMPSGIBundle:GrupoSoporte')->getByEmmpresa($incidente->getEmpresa()->getId());	
			$usuariosCliente = $this->getDoctrine()->getRepository('CHOMPSGIBundle:Usuario')->usuarioPorRol($session->get('empresa'), 'Cliente Externo');
			$idsRol = '0';
			foreach($usuariosCliente as $usuarioC){
				$idsRol = $idsRol.' ,'.$usuarioC->getRol()->getId();
			}
			$this->sessionSvc->setSession('idsRol', $idsRol);

			//Con esto SOLO permito grupos de soporte con responsables soporte.		
			$gSop = '0';
			
			foreach($grupoSoporte as $gSoporte){
				if(count($gSoporte->getUsuarios())>0){
					$gSop = $gSop.','.$gSoporte->getId();
				}
			}				
			$this->sessionSvc->setSession('gSop', $gSop);
			
			if(count($workflows)>0 && count($grupoSoporte)>0 && count($cuentaAnalitica)>0 && $incidente->getEstado()->getNombre() != 'Cerrado/Resuelto' && $gSop != '0'){
		
				$incidente2 = clone $incidente;
				
				//Obtengo todos los workflows
				$workflows = $this->getDoctrine()->getRepository('CHOMPSGIBundle:Workflow')->getByEmmpresa($this->sessionSvc->getSession('idEmpresaIncidente'));
				
				//Los recorro y separo sus "HASTA" para luego setearlos en el combo de la edicion.		
				$idsWorkflow = $incidente->getEstado()->getId();
				for($i=0; $i < count($workflows); $i++){			
					if($incidente->getEstado()->getId() == $workflows[$i]->getDesde()->getId()){
						$idsWorkflow = $idsWorkflow .', '. $workflows[$i]->getHasta()->getId();
					}
				}
				
				$this->sessionSvc->setSession('idEmpresaIncidente', $incidente->getEmpresa()->getId());
						
				$empresa = $this->getDoctrine()->getRepository('CHOMPSGIBundle:Empresa')->find($session->get('empresa'));
				$userSession = $this->getDoctrine()->getRepository('CHOMPSGIBundle:Usuario')->find($session->get('userId'));
		
				$form = $this->createForm(new IncidenteType($session->get('empresa'), $this->sessionSvc, 'EDITAR', $idsWorkflow), $incidente)->add('file')->add('save', 'submit', array ('label' => 'Guardar', 'attr'=> array('class'=>'btn')));
		
				$form->handleRequest($request);
		
				if ($form->get('save')->isClicked()) {
			
			// Las fechas dependiendo de si se editan o no, son tipo DateTime o String... esto lo verifica y hace la operacion correcta para modificar su tipo y ponerla como se debe para luego ser persistido.
					$tipo2 = gettype($incidente->getFechaCA());
					
					if($tipo2!= 'NULL'){
						if($incidente->getFechaCA()!= '' && $tipo2=='string'){
							$ca = $incidente->getFechaCA();
						}else{
							$ca = $incidente->getFechaCA()->format('Y-m-d H:i:s');
						}
						$fechaCierreAutomatico = new \DateTime($ca);
						$incidente->setFechaCierreAutomatico($fechaCierreAutomatico);
					}	
				
					if($incidente->getEstado()->getId() != $incidente2->getEstado()->getId() && $incidente->getEstado()->getId() == 2){
						$incidente->setFechaCierre(new \DateTime());
					}
		
					if($incidente->getPrioridad()->getId() != $incidente2->getPrioridad()->getId()){
						$hs = $incidente->getPrioridad()->getSLA();
						$b = 8;
						
						if($hs>=8){
							$c=round($hs/$b);
							$fechaLimiteSla = new \DateTime('NOW +'.$c.' day');
						}else{
							$fechaLimiteSla = new \DateTime('NOW +'.$hs.' hour');
						}		
						$incidente->setFechaLimiteSLA($fechaLimiteSla);
					}
		
				
					if ($form->isValid()) {
						$usuario = $em->getRepository('CHOMPSGIBundle:Usuario')->findOneBy(array('id' => $incidente->getResponsableSoporte()));
						
						$incidente->upload();
						$this->auditar($incidente,$incidente2,$userSession);
						$em->persist($incidente);
						$em->flush();
						
						if(count($usuario)>0){
							$message = \Swift_Message::newInstance()
							->setSubject('Se ha modificado un incidente.')
							->setFrom('sgicaece@gmail.com')
							->setTo($usuario->getEmail())
							->setBody( 'Se ha modificado el incidente con ID: '.$incidente->getId().' y nombre: '.$incidente->getTitulo().' puede visualizarlo desde la web.' );
										
							$this->get('mailer')->send($message);
						}
						return $this->redirect($this->generateUrl('incidentes_listar'));
					}
				}
		
				return $this->render('CHOMPSGIBundle:Incidentes:editar.html.twig', array(
							'form' => $form->createView(),
							'gruposSopote' => $grupoSoporte,
							'incidente' => $incidente,
							'cantComentarios' => count($comentarios), 'comentarios' => $comentarios
							));
			}else{
				if($incidente->getEstado()->getNombre() == 'Cerrado/Resuelto'){
					$this->sessionSvc->addFlash('msgWarn','El incidente no puede ser editado ya que esta Cerrado.');
					return $this->redirect($this->generateUrl('incidentes_listar')); 
				}else{
					$this->sessionSvc->addFlash('msgWarn','Debe definir al menos un workflow, una cuenta analítica y un grupo soporte (con Responsables asignados).');
					return $this->redirect($this->generateUrl('incidentes_listar')); 				
				}	
			}
		}else{
			return $this->redirect($this->generateUrl('chompsgi_homepage'));	
		}
    }
	
	public function incidenteImprimirAction($id) { 
		if ($this->sessionSvc->userIsLogged()){
			$incidente = $this->getDoctrine()
					->getRepository('CHOMPSGIBundle:Incidente')
					->find($id);
			
			if($this->sessionSvc->isGranted('VER_INCIDENTE_ALL')){
				$prioridad = 'true';
				$comentario = 'true';		
				$gruposoporte = 'true';		
				$responsablesoporte = 'true';		
				$cuentaanalitica = 'true';		
				$estado = 'true';
				$responsablecliente = 'true';		
			}else{
				$prioridad = $this->sessionSvc->isGranted('VER_INCIDENTE_PRIORIDAD');		
				$comentario = $this->sessionSvc->isGranted('VER_INCIDENTE_COMENTARIO');		
				$gruposoporte = $this->sessionSvc->isGranted('VER_INCIDENTE_GRUPOSOPORTE');		
				$responsablesoporte = $this->sessionSvc->isGranted('VER_INCIDENTE_RESPONSABLESOPORTE');		
				$cuentaanalitica = $this->sessionSvc->isGranted('VER_INCIDENTE_CUENTAANALITICA');		
				$estado = $this->sessionSvc->isGranted('VER_INCIDENTE_ESTADO');		
				$responsablecliente = $this->sessionSvc->isGranted('VER_INCIDENTE_RESPONSABLECLIENTE');		
			}
				
			$hoy = new \DateTime('NOW');
	
			$pdfGenerator = $this->get('siphoc.pdf.generator');
			$pdfGenerator->setName('INC-ID-'.$incidente->getId().'.'.$hoy->format('Y-m-d H:i:s').'.pdf');
			return $pdfGenerator->downloadFromView(
				'CHOMPSGIBundle:Incidentes:imprimir.html.twig', array(
					'incidente' => $incidente,
					'prioridad' => $prioridad,
					'comentario' => $comentario,		
					'gruposoporte' => $gruposoporte,		
					'responsablesoporte' => $responsablesoporte,		
					'cuentaanalitica' => $cuentaanalitica,		
					'estado' => $estado,
					'responsablecliente' => $responsablecliente)
				);
		}else{
			return $this->redirect($this->generateUrl('chompsgi_homepage'));	
		}
	}
	
	private function auditar($incidente, $incidente2, $user) {
	  //Sacar hora de la clase auditoria
	  $em = $this->getDoctrine()->getManager();
	  $auditoria = new Auditoria();
	  $auditoria->setFecha(new \DateTime('NOW'));
	  $auditoria->setHora(new \DateTime('NOW'));
	  $auditoria->setIncidente($incidente);
	  $auditoria->setUsuario($user);

	  if(!is_null($incidente2->getGrupoSoporte()) && $incidente->getGrupoSoporte()->getId() != $incidente2->getGrupoSoporte()->getId()){
	   $auditoria->setCampo('GrupoSoporte');
	   $auditoria->setValorAnterior($incidente->getGrupoSoporte()->getId());
	   $auditoria->setValorNuevo($incidente2->getGrupoSoporte()->getId());
	   $em->persist($auditoria);
	   $em->flush();
	   }
	  if(!is_null($incidente2->getPrioridad()) && $incidente->getPrioridad()->getId() != $incidente2->getPrioridad()->getId()){

		$auditoria->setCampo('Prioridad');
		$auditoria->setValorAnterior($incidente->getPrioridad()->getId());
		$auditoria->setValorNuevo($incidente2->getPrioridad()->getId());
		$hs = $incidente->getPrioridad()->getSLA();
		$b = 8;
		
		if($hs>=8){
			$c=round($hs/$b);
			$fechaLimiteSla = new \DateTime('NOW +'.$c.' day');
		}else{
			$fechaLimiteSla = new \DateTime('NOW +'.$hs.' hour');
		}		
		$incidente->setFechaLimiteSLA($fechaLimiteSla);
		
		$em->persist($auditoria);
		
		$em->flush();
	   }

	  if(!is_null($incidente2->getResponsableSoporte()) && $incidente->getResponsableSoporte()->getId() != $incidente2->getResponsableSoporte()->getId()){
	   $auditoria->setCampo('ResponsableSoporte');
	   $auditoria->setValorAnterior($incidente->getResponsableSoporte()->getId());
	   $auditoria->setValorNuevo($incidente2->getResponsableSoporte()->getId());
	   $em->persist($auditoria);
	   $em->flush();
	   }
	   
	  if(!is_null($incidente2->getResponsableCliente()) && $incidente->getResponsableCliente()->getId() != $incidente2->getResponsableCliente()->getId()){
	   $auditoria->setCampo('ResponsableCliente');
	   $auditoria->setValorAnterior($incidente->getResponsableCliente()->getId());
	   $auditoria->setValorNuevo($incidente2->getResponsableCliente()->getId());
	   $em->persist($auditoria);
	   $em->flush();
	  }

	  if($incidente->getEstado()->getId() != $incidente2->getEstado()->getId()){
	   $auditoria->setCampo('Estado');
	   $auditoria->setValorAnterior($incidente->getEstado()->getId());
	   $auditoria->setValorNuevo($incidente2->getEstado()->getId());
	   $em->persist($auditoria);
	   $em->flush();
	   }
	}

    public function listarImprimirAction($page) {
        			
		$query = $this->sessionSvc->getSession('query');		
		$us = $this->sessionSvc->getCurrentUser();

		$hoy = new \DateTime('NOW');
		$pdfGenerator = $this->get('siphoc.pdf.generator');
		$pdfGenerator->setName('INC-LISTADO-'.$hoy->format('Y-m-d H:i:s').'.pdf');
		return $pdfGenerator->downloadFromView(
			'CHOMPSGIBundle:Incidentes:listarImprimir.html.twig', array(
				'incidentes' => $query,
				'fechaHoy' => $hoy->format('Y-m-d H:i:s'),
				'usuario' => $us)
			);
    }	

	public function cierreAutoAction() {
		
		$incidentes = $this->getDoctrine()->getRepository('CHOMPSGIBundle:Incidente')->getAllVencidas();

	foreach($incidentes as $incidente){
			$estado = $this->getDoctrine()->getRepository('CHOMPSGIBundle:Estado')->find(2);
			$incidente->setEstado($estado);
			$em = $this->getDoctrine()->getManager();
			$em->persist($incidente);
			$em->flush();

			$this->sessionSvc->setSession('estado'.$incidente->getId(), $incidente->getEstado());

		
			$message = \Swift_Message::newInstance()
			->setSubject('Se le ha asignado un incidente.')
			->setFrom('sgicaece@gmail.com')
			->setTo($incidente->getCreador()->getEmail())
			->setBody( 'Se le ha cerrado el incidente con ID: '.$incidente->getId().' y titulo: '.$incidente->getTitulo().', debido a que su fecha de cierre automatico se ha cumplido.'  );
			$this->get('mailer')->send($message);

			$usRespS = $em->getRepository('CHOMPSGIBundle:Usuario')->findOneBy(array('id' => $incidente->getResponsableSoporte()));
			if(count($usRespS)){			
				$message = \Swift_Message::newInstance()
				->setSubject('Se le ha asignado un incidente.')
				->setFrom('sgicaece@gmail.com')
				->setTo($incidente->getResponsableSoporte()->getEmail())
				->setBody( 'Se le ha cerrado el incidente con ID: '.$incidente->getId().' y titulo: '.$incidente->getTitulo().', debido a que su fecha de cierre automatico se ha cumplido.'  );
				$this->get('mailer')->send($message);
			}

			$usRespC = $em->getRepository('CHOMPSGIBundle:Usuario')->findOneBy(array('id' => $incidente->getResponsableCliente()));
			if(count($usRespC)){			
				$message = \Swift_Message::newInstance()
				->setSubject('Se le ha asignado un incidente.')
				->setFrom('sgicaece@gmail.com')
				->setTo($incidente->getResponsableCliente()->getEmail())
				->setBody( 'Se le ha cerrado el incidente con ID: '.$incidente->getId().' y titulo: '.$incidente->getTitulo().', debido a que su fecha de cierre automatico se ha cumplido.'  );
				$this->get('mailer')->send($message);
			}
		
		}		
		return $this->redirect($this->generateUrl('chompsgi_inicio'));  	
	}

	public function avisoSlaAction() {
		
		$incidentes = $this->getDoctrine()->getRepository('CHOMPSGIBundle:Incidente')->getAllAvisos();
	
		foreach($incidentes as $incidente){
			
			$em = $this->getDoctrine()->getManager();
			
			$usRespS = $em->getRepository('CHOMPSGIBundle:Usuario')->findOneBy(array('id' => $incidente->getResponsableSoporte()));
			if(count($usRespS)>0){			
				$message = \Swift_Message::newInstance()
				->setSubject('Incidente por Vencer..')
				->setFrom('sgicaece@gmail.com')
				->setTo($incidente->getResponsableSoporte()->getEmail())
				->setBody( 'Hola '.$incidente->getResponsableSoporte()->getLogin().'! Están por cumplirse las horas estipuladas por la prioridad de incidente con ID: '.$incidente->getId().' y titulo: '.$incidente->getTitulo().'.'  );
				$this->get('mailer')->send($message);
			}
		}
		
		return $this->redirect($this->generateUrl('chompsgi_inicio'));  	
	}
			
}